#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int LTDataType;

// 定义双向带头链表结构体
typedef struct ListNode
{
    LTDataType data;
    struct ListNode *prev;
    struct ListNode *next;
}LTNode;

// 注意双向链表带有一个哨兵位
// 在插入数据之前需要先初始化这个哨兵位
LTNode *LTInit(void);

// 销毁双向链表
/* void LTDestory(LTNode **pphead);  不推荐这种,因为需要保持接口一致性 */
// 需要手动将phead置NULL
void LTDestory(LTNode *phead);

// 打印双向链表
void LTPrint(LTNode *phead);

// 按照数据值查找节点
LTNode *LTFind(LTNode *phead, LTDataType x);

// 注意在头的前面有一个哨兵位
// 插入数据
// 尾插
void LTPushBack(LTNode *phead, LTDataType x);
// 头插
void LTPushFront(LTNode *phead, LTDataType x);
// 指定位置之后插
void LTInsertAfter(LTNode *pnode, LTDataType x);
// 指定位置之前插
void LTInsertBefore(LTNode *pnode, LTDataType x);

// 删除数据
// 尾删
void LTPopBack(LTNode *phead);
// 头删
void LTPopFront(LTNode *phead);
// 指定位置删除
void LTErase(LTNode *pnode);